package com.ruoyi.device.task;

import com.ruoyi.device.domain.DeviceCollectConfig;
import com.ruoyi.device.mapper.DeviceCollectConfigMapper;
import com.ruoyi.device.service.IDeviceCollectConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 设备状态采集定时任务
 * 
 * 使用说明：
 * 1. 在定时任务管理中添加任务
 * 2. 任务名称: 设备状态采集
 * 3. 调用目标: deviceCollectTask.execute()
 * 4. cron表达式: 0/30 * * * * ?  (每30秒执行一次)
 * 5. 根据配置的 collect_interval 字段调整实际执行间隔
 * 
 * @author ruoyi
 * @date 2025-10-20
 */
@Component("deviceCollectTask")
public class DeviceCollectTask
{
    private static final Logger log = LoggerFactory.getLogger(DeviceCollectTask.class);

    @Autowired
    private DeviceCollectConfigMapper deviceCollectConfigMapper;

    @Autowired
    private IDeviceCollectConfigService deviceCollectConfigService;

    /**
     * 执行设备状态采集
     * 自动采集所有启用状态的配置
     */
    public void execute()
    {
        log.info("开始执行设备状态采集定时任务");
        
        try
        {
            // 查询所有启用的配置
            List<DeviceCollectConfig> enabledConfigs = deviceCollectConfigMapper.selectEnabledConfigs();
            
            if (enabledConfigs == null || enabledConfigs.isEmpty())
            {
                log.info("没有启用的采集配置");
                return;
            }
            
            log.info("找到 {} 个启用的采集配置", enabledConfigs.size());
            
            // 遍历执行每个配置的采集任务
            for (DeviceCollectConfig config : enabledConfigs)
            {
                try
                {
                    log.info("执行采集配置: {} (ID: {})", config.getConfigName(), config.getConfigId());
                    deviceCollectConfigService.executeCollect(config.getConfigId());
                }
                catch (Exception e)
                {
                    log.error("采集配置执行失败: {} (ID: {})", config.getConfigName(), config.getConfigId(), e);
                }
            }
            
            log.info("设备状态采集定时任务执行完成");
        }
        catch (Exception e)
        {
            log.error("设备状态采集定时任务执行异常", e);
        }
    }

    /**
     * 执行指定配置的采集
     * 用于定时任务管理中配置特定配置ID的采集
     * 
     * @param configId 配置ID
     */
    public void executeById(Long configId)
    {
        log.info("开始执行指定配置的设备状态采集, 配置ID: {}", configId);
        
        try
        {
            deviceCollectConfigService.executeCollect(configId);
            log.info("指定配置的设备状态采集执行完成, 配置ID: {}", configId);
        }
        catch (Exception e)
        {
            log.error("指定配置的设备状态采集执行异常, 配置ID: {}", configId, e);
        }
    }

    /**
     * 测试方法 - 执行采集并输出日志
     */
    public void test()
    {
        log.info("执行设备状态采集测试任务");
        execute();
    }
}

